<?php
// namespace \Common\Util;
/**
 * openssl公钥私钥加密解密
 * 
 */
class Deopenssl {

	// 配置文件
	public $conf = array(
			'pubkey' => '',//公钥
			'prikey' => '',//私钥
		);
	/**
	 * 构造函数
	 * @param config 配置数组
	 */
	public function __construct( $config = array() ){
		// 配置参数
		$this->conf = array_merge($this->conf, $config);
	}

	/**
	 * 公钥加密
	 * @param data 数据
	 * @param public 公钥
	 * @param patt 加密模式
	 * @return sign 加密密文
	 */
	public function publicEncryt( $data , $public = '' , $patt = '' ){
		// 读取公钥str字符串
		$pubstr = empty($public) ? $this->conf['pubkey'] : $public;
		// 使用openssl读取公钥
		$pubkey = openssl_get_publickey($pubstr);
		// 加密模式
		$pattern = empty($patt) ? OPENSSL_PKCS1_PADDING : $patt;
		// 加密数据
		openssl_public_encrypt($data, $enData, $pubkey, $pattern);
		// 签名转换成Base64编码 可读
		$sign = base64_encode($enData);

		return $sign;
	}

	/**
	 * 私钥加密
	 * @param data 数据
	 * @param private 私钥
	 * @param patt 加密模式
	 * @return sign 加密密文
	 */
	public function privateEncryt( $data , $private = '' , $patt = '' ){
		// 读取私钥str字符串
		$pristr = empty($private) ? $this->conf['prikey'] : $private;
		// 使用openssl读取私钥
		$prikey = openssl_get_privatekey($pristr);
		// 加密模式
		$pattern = empty($patt) ? OPENSSL_PKCS1_PADDING : $patt;
		// 加密数据
		openssl_private_encrypt($data, $enData, $prikey, $pattern);
		// 签名转换成Base64编码 可读
		$sign = base64_encode($enData);

		return $sign;
	}

	/**
	 * 公钥解密
	 * @param data 数据
	 * @param public 公钥
	 * @param patt 加密模式
	 * @return deData 解密密文
	 */
	public function publicDecrypt( $data , $public = '' , $patt = '' ){
		// 读取公钥str字符串
		$pubstr = empty($public) ? $this->conf['pubkey'] : $public;
		// 使用openssl读取公钥
		$pubkey = openssl_get_publickey($pubstr);
		// 解密模式
		$pattern = empty($patt) ? OPENSSL_PKCS1_PADDING : $patt;
		// 签名转换成Base64编码 可读
		$baseData = base64_encode($data);
		// 解密数据
		openssl_public_decrypt($baseData, $deData, $pubkey, $pattern);

		return $deData;
	}

	/**
	 * 私钥解密
	 * @param data 数据
	 * @param private 私钥
	 * @param patt 加密模式
	 * @return deData 解密密文
	 */
	public function privateDecrypt( $data , $private = '' , $patt = '' ){
		// 读取私钥str字符串
		$pristr = empty($private) ? $this->conf['prikey'] : $private;
		// 使用openssl读取私钥
		$prikey = openssl_get_privatekey($pristr);
		// 解密模式
		$pattern = empty($patt) ? OPENSSL_PKCS1_PADDING : $patt;
		// 签名转换成Base64编码 可读
		$baseData = base64_encode($data);
		// 解密数据
		openssl_private_decrypt($baseData, $deData, $prikey, $pattern);

		return $deData;
	}

	/**
	 * 校验公钥私钥是否存在
	 * @return status 状态(true存在 false不存在) msg 提示
	 */
	private function existKey(){
		// 信息
		$res = array('status'=>false, 'msg'=>'error');
		// 判断公钥是否存在
		if( empty($this->conf['pubkey']) ){
			// 提示信息
			$res['msg'] = 'public key not exist!';
			return $res;
		}
		// 判断私钥是否存在
		if( empty($this->conf['pubkey']) ){
			// 提示信息
			$res['msg'] = 'private key not exist!';
			return $res;
		}
		$res['status'] = true;
		$res['msg'] = 'success';
		return $res;
	}

}
